


//
// Created by ChaoDONG on 2021-03-17.
//

/* floatcnv.c -- mismatched floating-point conversions */
#include <stdio.h>
int main(void){

    float n1 = 3.0;

    double n2 = 3.0;

    long n3 = 2000000000;

    long n4 = 1234567890;
    printf("%.1e %.1e %.1e %.1e\n", n1, n2, n3, n4);
    /* %e转换说明让printf()函数认为待打印的值是double类型（本系统中double为8字节）。
     * 当printf()查看n3（本系统中是4字节的值）时，除了查看n3的4字节外，
     * 还会查看查看n3相邻的4字节，共8字节单元。即使n3的位数正确，
     * 根据%e转换说明和%ld转换说明解释出来的值也不同。
     * 最终得到的结果是无意义的值。*/

    /* float类型的值作为printf()参数时会被转换成double类型。 */

    printf("%ld %ld\n", n3, n4);


    printf("%ld %ld %ld %ld\n", n1, n2, n3, n4);
    /*  该调用告诉计算机把变量n1、n2、、n3和n4的值传递给程序。这是一种
    常见的参数传递方式。程序把传入的值放入被称为栈（stack）的内存区域。该函
    数根据转换说明（不是根据变量类型）从栈中读取值。%ld转换说明表明
    printf()应该读取4字节，所以printf()读取栈中的前4字节作为第1个值。这是
    n1的前半部分，将被解释成一个long类型的整数。根据下一个%ld转换说
    明，printf()再读取4字节，这是n1的后半部分，将被解释成第2个long类型的
    整数（见图4.9）。 */

    return 0;
}